package com.hzw.saas.api.property;

import com.hzw.saas.api.property.bo.PropertyBO;
import com.hzw.saas.api.property.query.PropertyAddQuery;
import com.hzw.saas.api.property.query.PropertyUpdateQuery;

import java.util.List;

/**
 * @author zzl
 * @since 09/13/2021
 */
public interface IPropertyService<T> {

    String SYS_PARAM_BEAN = "sysParamService";
    String SYS_DICT_BEAN = "sysDictService";

    /**
     * 获取property信息
     *
     * @param id id
     * @return property属性，未找到返回空对象(所有属性为null)
     */
    PropertyBO getProperty(String id);

    /**
     * 获取property信息
     *
     * @param module module
     * @param key    key
     * @return property属性，未找到返回空对象(所有属性为null)
     */
    PropertyBO getProperty(String module, String key);

    /**
     * 获取property信息
     *
     * @param key key
     * @return property属性，未找到返回空对象(所有属性为null)
     */
    PropertyBO getProperty(T key);

    /**
     * 获取property value
     *
     * @param module module
     * @param key    key
     * @return property value，未找到返回""
     */
    String getPropertyValue(String module, String key);

    /**
     * 获取property value
     *
     * @param key key
     * @return property value，未找到返回""
     */
    String getPropertyValue(T key);

    /**
     * 获取property value
     *
     * @param module       module
     * @param key          key
     * @param defaultValue 未找到时的默认值
     * @return property value，未找到或""返回default value
     */
    String getPropertyValue(String module, String key, String defaultValue);

    /**
     * 获取property value
     *
     * @param key          key
     * @param defaultValue 未找到时的默认值
     * @return property value，未找到或""返回default value
     */
    String getPropertyValue(T key, String defaultValue);

    /**
     * 获取属性列表
     *
     * @param module module
     * @return property list
     */
    List<PropertyBO> listProperties(String module);

    /**
     * 增加属性
     *
     * @param query query
     * @return property added
     */
    PropertyBO addProperty(PropertyAddQuery query);

    /**
     * 更新属性
     *
     * @param query query
     * @return update result
     */
    boolean updateProperty(PropertyUpdateQuery query);

    List<PropertyBO> getWechatAttribute(String type);

}
